import {_decorator, Component, instantiate, macro, math, Prefab, resources} from 'cc';
import {ModelPath} from "db://assets/Scripts/Common/ModelPath";
import {EventManager} from "db://assets/Scripts/Common/EventManager";
import {EventType} from "db://assets/Scripts/Common/EventType";

const {ccclass, property} = _decorator;

/**
 * 道具管理器
 */
@ccclass('PropManager')
export class PropManager extends Component {
    /**
     * 道具模型
     */
    private propBulletPrefab: Prefab = null;
    /**
     * 道具模型列表
     */
    private propBulletPrefabs: Prefab[] = [];

    onLoad() {
        // 初始化模型
        this.initModel();
    }

    onEnable() {
        // 注册创建玩家事件
        EventManager.on(EventType.RESTART, this.onRestart, this);
    }

    onDisable() {
        // 取消注册创建玩家事件
        EventManager.off(EventType.RESTART, this.onRestart, this);
    }

    start() {

    }

    update(deltaTime: number) {

    }

    /**
     * 初始化模型
     */
    private initModel() {
        // 加载道具模型
        resources.load([ModelPath.propBulletS, ModelPath.propBulletH, ModelPath.propBulletM], Prefab, (err, data) => {
            if (err) {
                console.error("加载道具模型资源失败！");
                return;
            }

            // 记录道具列表
            this.propBulletPrefabs = data;
            // 设置初始道具
            this.propBulletPrefab = this.propBulletPrefabs[2];
        });
    }

    /**
     * 随机道具调度器
     */
    private randomPropSchedule() {
        this.schedule(() => {
            // 随机道具列表索引
            const index = math.randomRangeInt(0, this.propBulletPrefabs.length);
            // 设置道具模型
            this.propBulletPrefab = this.propBulletPrefabs[index];
        }, 10, macro.REPEAT_FOREVER);
    }

    /**
     * 调度道具
     */
    private createPropSchedule() {
        // 每 30 秒产生一个道具
        this.schedule(this.createProp, 10, macro.REPEAT_FOREVER);
    }

    /**
     * 创建道具
     */
    private createProp() {
        // 实例化道具模型
        const propNode = instantiate(this.propBulletPrefab);
        // 设置父节点
        propNode.setParent(this.node);
        // 设置出生位置
        propNode.setPosition(0, 0, -10);
    }

    /**
     * 当创建玩家时
     */
    private onRestart() {
        // 销毁所有子节点
        this.node.destroyAllChildren();

        // 取消所有定时任务
        this.unscheduleAllCallbacks();

        // 随机道具调度器
        this.randomPropSchedule();
        // 创建道具调度器
        this.createPropSchedule();
    }
}